INT 21H 指令说明及使用方法

INT 21H一般搭配着AH使用。

1
2
MOV AH, 01H
INT 21H

在很多时候我们想要去做汇编程序的输入与输出(从键盘上直接的输入)并且屏幕上能显示的那种,我们就可以

输入:

1
2
MOV AH, 0AH
INT 21H

输出:

1
2
MOV AH, 0AH
INT 21H

例题

接下来我们用两个例子加深一下学习

(1)Y=2X+6,X为无符号字节变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
DATA SEGMENT
INPUT DB 'Plase enter a number(0~9):X=$'
PRINT DB 'Y=2X+6=$'
ENTER DB 10,13,'$'
NUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:MOV AX,DATA
MOV DS,AX
mov dx, offset INPUT;输入提示,这里等于LEA DX,INPUT;输入提示
MOV AH,09H
INT 21H

MOV AH,01H;输入
INT 21H

MOV NUM,AL;定义变量num
AND AL,0FH;将 AL 的高 4 位清零,只保留低 4 位的值。计算2X+6
ADD AL,AL
ADD AL,6
AAM;用于将二进制数转换为十进制数。它将一个字节的二进制数除以 10,将商存储在 AH 寄存器中,余数存储在 AL 寄存器中。
MOV BX,AX;在之前的代码中,我们使用了 AAM 指令将计算得到的 Y 值存储在 AX 寄存器中。
LEA DX,ENTER;换行;通过执行 MOV BX, AX,我们将 Y 值的十位数部分存储在 BX 的高字节(BH)中,将个位数部分存储在 BX 的低字节(BL)中。
MOV AH,09H
INT 21H

LEA DX,PRINT;输出提示
MOV AH,09H
INT 21H

MOV DL,BH;输出十位数部分存储在 BX 的高字节(BH)中
ADD DL,30H;转换ascii值
MOV AH,02H
INT 21H

MOV DL,BL;个位数部分存储在 BX 的低字节(BL)中
ADD DL,30H;转换ascii值
MOV AH,02H
INT 21H

MOV AH,4CH;结束
INT 21H
CODE ENDS
END BEGIN

在实现这个功能的asm代码中

第一个int 21

1
2
3
MOV dx, offset INPUT
MOV AH,09H
INT 21H

mov ah, 9 的作用是显示字符串,DS:DX=串地址’$'结束字符串

mov dx, offset INPUT 的作用是获取字符串的偏移地址,将resultMsg的首地址传送给基址寄存器dx

int 21h 你可以把它理解为return 0(我瞎编的),有标识作用,这三个的组合就像一个小型函数,实现了从ds的起始地址到结束字符串中间的字符显示

第二个int 21

1
2
3
4
mov al, Y       
add al, 30h
mov ah, 2
int 21h

mov ah, 2 的作用是显示输出,DL=输出字符

这里是通过将 Y 的值加载到 AL 寄存器中,将其转换为 ASCII 码字符,并使用 int 21h 中断调用来显示字符

也就是说al也可以显示输出,不过常用DL

第三个int 21

1
2
3
4
5
mov dl, 13      ; 换行的ASCII码
mov ah, 2
int 21h
mov dl, 10 ; 回车的ASCII码
int 21h

两个mov ah, 2显示输出,13和10是换行和回车的ASCII值,实现了使用回车符和换行符的组合(CR+LF)来表示文本中的换行,这是为了程序正常输出

如果你删除这段代码,那么在 Y 的值显示后,就不会添加换行符和回车符,而是直接继续输出后续内容。这可能会导致输出结果在控制台上显示在同一行上,而不是每个输出占用一行。

因此,删除这段代码不会影响程序的功能,但会影响输出的外观。如果你希望每个输出都显示在单独的一行上,可以保留这段代码。如果你希望输出连续在同一行上,可以删除这段代码。

第四个int 21

1
2
mov ah, 4Ch
int 21h

带返回码结束,这个是真的相当于return 0了.

(2) 编程实现从键盘上接收两个一位十进制数,计算并显示它们的积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC FAR
START:
MOV AH,01H ; 读取一个字符
INT 21H

SUB AL,30H ; 将字符转换为数字

MOV BL,AL ; 将数字保存在BL寄存器中

MOV AH,01H ; 读取另一个字符
INT 21H

SUB AL,30H ; 将字符转换为数字

MUL BL ; 将两个数字相乘,结果存储在AX寄存器中

MOV BH,AH ; 将结果的高位保存在BH寄存器中
MOV BL,0AH ; 将除数设置为10
DIV BL ; 将结果除以10,商存储在AL寄存器中,余数存储在AH寄存器中

ADD AH,30H ; 将余数转换为字符
ADD AL,30H ; 将商转换为字符
MOV BX,AX ; 将结果保存在BX寄存器中
MOV DL,BL ; 将余数存储在DL寄存器中
MOV AH,02H ; 打印字符
INT 21H

MOV DL,BH ; 将商存储在DL寄存器中
MOV AH,02H ; 打印字符
INT 21H

MOV AH,4CH ; 程序退出
INT 21H
MAIN ENDP
CODE ENDS
END START